/**
 * @file tpl_startup.S
 *
 * @section desc File description
 *
 * Startup code called just after reset of cpu. This code then calls the 
 *
 * @section copyright Copyright
 *
 * Trampoline RTOS
 *
 * Trampoline is copyright (c) CNRS, University of Nantes, Ecole Centrale de Nantes
 * Trampoline is protected by the French intellectual property law.
 *
 * This software is distributed under the GNU Public Licence V2.
 * Check the LICENSE file in the root directory of Trampoline
 *
 * @section infos File informations
 *
 * $Date$
 * $Rev$
 * $Author: DavidGarriou $
 * $URL: https://github.com/TrampolineRTOS/trampoline $
 */


.syntax unified
.thumb

/**
 * @internal
 *
 * tpl_reset_handler
 *
 * tpl_reset_handler is the first function called after a cpu reset.
 * This function must be referenced at the index 1 of the vector table.
 *
 * We will use PSP (Process Stack Pointer) and MSP (Main Stack Pointer).
 * The cpu starts in privileged thread mode using MSP.
 * 1 - Copy MSP into PSP
 * 2 - Switch to use PSP
 * Just after the modification of CONTROL register (set to use both PSP and MSP) 
 * the cpu will use PSP. So we MUST initialize PSP with a temporary value otherwise
 * the startup will crash.
 * We can initialize PSP with the current value of MSP because PSP will be updated 
 * with the stack of running processes. The first process to run is the idle task.
 *
 * @param
 */
	.global tpl_reset_handler
	.type tpl_reset_handler, %function
tpl_reset_handler:
  /* Copy MSP into PSP */
  mrs r0, msp
  msr psp, r0
  /* Switch to use PSP, privileged state */
  movs r0, #2
  msr control, r0
  /* Instruction Synchronization Barrier */
  isb
  /* Branch to the subsequent reset handler code */
  b tpl_continue_reset_handler
